// 输入一个正整数 target ，输出所有和为 target 的连续正整数序列（至少含有两个数）。
// 序列内的数字由小到大排列，不同序列按照首个数字从小到大排列。

function findContinuousSequence(target: number): number[][] {
    const res: number[][] = [];// 声明结果数组
    let windowLeft: number = 1;// 声明左窗口边界
    let windowRight: number = 1;// 声明右窗口边界
    let half: number = Math.floor(target / 2);
    let sum: number = 0;// 总和
    // 滑动窗口算法
    while (windowLeft <= half) {
        // 情况一：右窗口右滑
        if (sum < target) {
            sum = sum + windowRight;
            windowRight++;
            // 情况二：左窗口右滑
        } else if (sum > target) {
            sum = sum - windowLeft;
            windowLeft++;
        } else {
             // 情况三：将当前结果放入结果数组中
            const curr: number[] = [];
            for (let i = windowLeft; i < windowRight; i++) {
                curr.push(i);
            }
            res.push(curr);
            sum -= windowLeft;// 重要！！左窗口右滑，不要忘记了
            windowLeft++;
        }
    }
    // 返回结果数组
    return res;
}

这道题目就是一个比较典型的用滑动窗口求解的问题
因为数组是有序的
滑动窗口可以看成数组中框起来的一个部分。
在这种数组类题目中，我们可以用滑动窗口来观察可能的候选结果。
一般为了边界判断的方便，滑动窗口的指针索引都会采用左闭右开的形式
滑动窗口的重要性质是：窗口的左边界和右边界永远只能向右移动，而不能向左移动。
在这道题中，我们关注的是滑动窗口中所有数的和。
我们不断判断当前连续序列的和与target是否相等
然后通过右边界向右移动（扩大窗口） 和 左边界向右移动（缩小窗口） 两个操作来实现区间的控制
当窗口的和小于 target 的时候，窗口的和需要增加，所以要扩大窗口，窗口的右边界向右移动
当窗口的和大于 target 的时候，窗口的和需要减少，所以要缩小窗口，窗口的左边界向右移动
这里要注意一点当窗口的和恰好等于 target 的时候，
我们需要记录此时的结果，我们已经找到了一个 i 开头的序列，也是唯一一个 i 开头的序列，
接下来需要找 i+1开头的序列，所以窗口的左边界要向右移动
在上面这个部分我卡了一段时间...


